package com.wanxi.util;

public class ReadMe {
    /**
     * 2023-5-25 数据库基础
     * 数据库不区分大小写。建议全小写，如果有多个单词，则用下划线分开
     * 1.安装mysql
     * 2.连接到数据库
     * 3.创建数据库的名称：CREATE SCHEMA `canyin` ;
     * 4.指定使用某个数据库：use canyin;
     * -- tables 表
     * -- views  视图
     * -- stored procedures  存储过程
     * -- functions  函数
     * 5.创建表：表明和model层里面的列名一致
     *      1)主键：表示当前数据唯一，自带索引，查询速度快
     *          主键不能为空，自带索引，最好自动自增
     *      2)列名：理解为类的属性：一一对应即可
     *      3）数据类型：建议和Java的model对应，也可以全部用字符串
     *          VARCHAR(45)  可变字符串   45，最多存45个字符
     *          一般存255个字符之内的
     *          char(45)  不可变字符长度   45代表分配45个字符空间
     *           一般用于固定长度的字符串，查询效率快，密码，UUID等
     *          text   一般用于存很多字符串，一般用于存富文本内容
     *       4）一般数据库还需要多增加几个字段
     *          1）id
     *          2）create_time
     *          3）update_time
     *          4）enable  状态
     *          5）remark 备注
     *        CREATE TABLE `canyin`.`user` (
     *   `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
     *   `username` VARCHAR(45) NULL,
     *   `password` CHAR(32) NULL COMMENT '密码应该加密',
     *   `email` VARCHAR(100) NULL,
     *   `phone` CHAR(11) NULL,
     *   `address` VARCHAR(100) NULL,
     *   `birthday` DATE NULL,
     *   `age` TINYINT UNSIGNED ZEROFILL NULL,
     *   `sex` VARCHAR(1) NULL DEFAULT '男',
     *   `hobby` VARCHAR(100) NULL,
     *   `create_time` DATETIME NULL,
     *   `update_time` DATETIME NULL,
     *   `enable` TINYINT NULL,
     *   `remark` VARCHAR(255) NULL,
     *   PRIMARY KEY (`id`),
     *   UNIQUE INDEX `username_UNIQUE` (`username` ASC) VISIBLE)
     * COMMENT = '用户表';
     * 6.将你们第三阶段的model层全部创建表：
     * 7.在model里面添加固定的属性
     * 8.一般情况下   model和表的列一一对应即可
     * 9.修改表列：
     * ALTER TABLE `user`
     * CHANGE COLUMN `hobby` `hobbys` VARCHAR(150) NULL DEFAULT NULL ;
     * 10.增加一条数据
     *  INSERT INTO `user` (`username`, `password`, `email`, `phone`, `address`, `birthday`, `age`, `sex`,
     *  `hobby`, `create_time`, `update_time`, `enable`, `remark`) VALUES (
     *  '1', '1', '1', '1', '1', '1999-01-01', '1', '1',
     *  '1',now(), sysdate(), '1', '1');
     *  格式：
     *  insert into 表名(列名，列名) values(值，值),(值，值),(值，值)
     * 11。任务：
     *      将第三阶段dao层的数据通过sql语句插入到对应的表里面
     * 12.注意：以后数据库里面最好有默认值，不允许出现空值
     * 13.列名或者表明一般用`括起来，主要目的就是区分关键字。字符串用单引号括起来
     * 14.修改表里面的数据
     *  UPDATE `user` SET
     *  `username` = '33',
     *  `password` = '333',
     *  `email` = '333',
     *  `phone` = '3',
     *  `address` = '3',
     *  `birthday` = '2022-2-2',
     *  `age` = '2', `sex` = '女',
     *  `hobby` = '3', `enable` = '3',
     *  `remark` = '3' WHERE (`id` = '10');
     *  格式：
     *  update 表名 set
     *  列名=值,列名=值
     *  where id=10；
     *  15.删除表里面的数据
     *  DELETE FROM `user` WHERE (`id` = '9');
     *  格式：delete from 表名 where id=1;
     *  16.删除还有其他形式；
     *          truncate user; 清空表数据，
     *          delete 删除某一条数据
     *          drop user，直接删除表,包括表结构
     *  17.mysql 日期格式化
     *      SELECT date_format(create_time,'%Y/%m/%d') as create_time  FROM user;
     *  18.对sql语句取别名
     * -------------------------------
     * 任务：
     *    1.创建表
     *    2.将dao层数据通过sql语句存入数据库
     * 19.DATETIME和TIMESTAMP之间的区别？
     * 20.删除数据库：DROP DATABASE `canyin`;
     * -------------------------------
     * 21.如果想要访问别人的数据库，必须给别人一个权限
     * 22.将数据库里面的数据进行导入导出？
     * -----------------------------------------
     * 23.如果以后一条数据有多个值，
     *      则考虑将这个值单独创建要给表，然后和这个表相关联即可
     * ----------------------------------------------
     * 任务：
     *      1.数据的导入导出
     *      2.权限设计
     *      3.将模糊查询练习一下
     */
    /**
     * 2023-5-26 数据库查询
     * 1.排序  order by
     *  SELECT * FROM product order by create_time desc
     *  默认情况下是从小到大排序  省略关键字 asc
     *  asc  升序排列
     *  desc 降序排列
     * 2.分组
     *  select name from product group by name,normal_price;
     *  select name,normal_price from product  group by name,normal_price  having  normal_price>10;
     *  having只有分组才有，相当于对分组的条件查询
     *  子查询
     *  select * from (
     * select name,normal_price from product  group by name,normal_price ) temp where normal_price>10;
     * 将结果当作一个临时表  并取一个别名
     * 3.分页：每次查询都不应该将所有数据全部查询出来，而是查询里面的某些数据
     *   -- limit （pageNo-1）*pageSize，pageSize, 第3页，每页显示5条数据
     * -- select * from product limit (3-1)*5,5;
     * select * from product limit 10,5;
     * limit后面不能跟运算符表达式，只能跟一个结果
     * limit 10,5;  limit start,size；start从那一条开始，size往后数几条数据
     * 4.面试的时候：select count(normal_price) count from product
     * 和select count(*) count from product
     * 和select count(1) count from product
     * 和select count(id) count from product
     * 有什么区别？
     * 5.表与表的关系？一对多，多对一，一对一，多对多
     *      对于一对一，为什么不放一个表，而放两张表
     *      以后，表越简单越好，不要太多的暴露给别人
     *      对于经常或者长期不修改的列，固定的列最好单独用一个表
     *      一般情况下在多的这张表里面加一的id
     *      菜系 cuisine  产品product
     *      1               n
     *      就应该在产品表里面加菜系id   cuisine_id；
     *      ----------
     *      以后建议不要在表里面添加其他表的属性
     * 6.取两张表的交集：交叉连接
     *      select * from product,cuisine
     *      where product.cuisine_id=cuisine.id;
     * 7.笛卡尔积：
     *      select * from product t1,cuisine t2;
     * 8.左连接：
     * select * from product t1
     * left join cuisine t2
     * on t1.cuisine_id=t2.id;
     * 9.内连接：
     * select * from product t1
     * inner join cuisine t2
     * on t1.cuisine_id=t2.id;
     * 10.右链接：
     * select * from product t1
     * right join cuisine t2
     * on t1.cuisine_id=t2.id;
     * 11.合并查询
     * select * from product where id in(72,79)
     * union all
     * select * from product where id in(79,89)
     * union all
     * select * from product where id in(89,107);
     * 不同表也可以合并查询
     * 12.sql语句的编写顺序
     * select -->from-->where -->group by-->having-->order by -->limit
     *
     */
    /**
     * 2023-5-29 Java连接数据库
     * 1.用户登录为例：用户注册
     * 2.思路分析：
     *      1）创建Javaweb项目
     *      2）分层：三层架构
     *      3）提取JavaBean
     *      4）提供给API接口：servlet层
     *      5）业务逻辑处理 ：service层
     *      6）数据持久化处理：dao层
     *      7）将数据保存到数据库：DB database
     * 3.UML，统一建模语言
     *      1）ER图:提取对象
     *      2）用例图：划分系统功能模块
     *      3）流程图：
     *      4）类图：  类与类之间的关系？
     *              泛化：继承，实现
     *              依赖
     *              关联：聚合（弱关系），组合（强关系）
     *      5）时序图：时间顺序图
     * 4.coding
     *      能够在数据库操作的不要放在Java
     *      能够在前端做的不要放在Java
     *
     */
    /**
     * 2023-5-30 后台代码的封装
     * 1.更新
     *      1）servlet  五大步骤：多了一个id
     *      2）service  和增加一样
     *      3）dao   sql语句
     * 2.以后禁用（少用）*，用具体的列
     * 3.对于查询所有，一般情况下会在查询一下总条数
     * 4.查询所有和查询总条数的条件应该一模一样
     * 5.Java后台做CRUD
     *      1）model
     *      2）servlet
     *      3）service
     *      4）dao（难点）
     * 6.菜系的增删改查
     * 7.今天的任务：
     *      将自己所有表的增删查改做完
     *      一个表对于一个model，对应一个service，对应一个dao，对应一个dto
     *      一个操作对应一个servlet
     */
    /**
     * 2023-5-31 文件上传
     * 1.产品查询时，对于管理员来说，需要查看是哪个菜系，而不是看到菜系的id
     * 2.文件上传：
     *      思路：
     *      同样需要传递一个图片，post io流
     *      用req接收前端的数据，将接收的数据（io流）进行解析，解析为文件然后保存到Java后台
     *      1.得到req
     *      2.解析req为文件
     *      3.保存到服务器
     * -------------------------------
     *
     *
     */
    /**
     * 2023-6-1 JavaScript基础
     * 1.js 的数据类型
     * 2.layui的引入
     * 3.正则表达式的验证
     * 4.按钮的监听
     * 5.ajax
     * 6.根据逻辑判断跳转页面
     * --------------------------------
     * 登录：
     *  1.创建页面：修改css和js的路径
     *  2.创建js：
     *          1）页面加载完成执行里面的代码
     *          2）加载layui模板
     *          3）用户输入信息
     *          4）验证输入信息是否正确 form.verify({
     *          5)监听按钮提交
     *          6）调用ajax
     *          7）根据返回的数据进行逻辑判断
     *          8）添加验证码
     *              1)pom.xml
     *              2）CodeServlet
     *              3）UserLoginServlet
     *              4）UserServiceImpl
     */
    /**
     * 2023-6-2 用户管理
     * 1.页面之间的值相互传递
     * 2.用户查询
     *      1）创建页面 复制表格<table class="layui-hide" id="table" lay-filter="table"></table>
     *      2)创建js
     *          1：$(function () {
     *          2：加载模板 layui.use(['table', 'laydate', 'form'], function () {
     *          3：表格渲染： table.render({
     *          4：修改key值
     *              elem: '#table',
     *             url: '/back/user/findAll' ,对应Java后台servlet的注解
     *             cols:对应后台对象的属性
     *          5： page: true//默认开启分页
     * 3.js  ===等同于Java的==
     *      js 的== 等同于Java的equals
     * 4.增加
     *      1：页面
     *      2：js
     *          1）$(function () {
     *          2） layui.use(['form', 'laydate', 'layer', 'jquery'],
     *          3）日期弹出框： laydate.render({
     *          4）自定义验证form.verify({
     *          5）监听按钮： form.on('submit(add)',
     *          6）拿到表单的值：复选框手动拿
     *           $("input[type=checkbox][name=hobby]:checked").each(function (index, obj) {
     *          7）调用Ajax，根据返回结果进行逻辑处理
     */
    /** 2023-6-5 用户编辑
     * 1.页面
     * 2.js
     *      1)得到值
     *          1:list.js里面传递json对象，将对象转换为字符串到update页面
     *          2：update.js里面得到值，并转换为json对象
     *
     *      2）将数据赋值到表单
     *           赋值：单选框和复选框手动操作，最后重新渲染表单
     *      3）点击修改
     * 3.产品:
     *      1.修改产品导航
     *      2.创建页面
     *      3.创建js
     *          1：修改url地址
     *          2：修改列
     * 4.产品增加：
     *      1：页面
     *      2：js
     *          1：$(function () {
     *          2：layui.use(['upload',
     *          3： upload.render({
     *          4：得到菜系
     * 5.编辑
     *      1：页面
     *      2：js
     *          1：对菜系进行下拉菜单赋值
     *          2：根据list得到数据，并赋值给表单
     *              注意：
     *              1.需要将id和图片地址赋值给隐藏框
     *              2.一定先对菜单进行赋值然后对表单进行赋值
     *          3:监听修改按钮进行修改即可
     *
     */
    /**
     * 2023-6-6 模糊查询-富文本-session安全认证
     * 1.模糊查询
     *      思考：
     *      1.应该有那些模糊查询的条件
     *      2.监听查询按钮
     *      3.拿到表单的值
     *      4.调用table.render渲染数据
     * 2.富文本
     *      1.导包wangEditor.js
     *      2.引用wangEditor.js。注意要放在其他js之前
     *      3.在html里面加html代码
     *      4：在js里面加富文本创建的代码
     *              1： const editor = new E('#content');
     *              2： const editUrl = '/upload';//服务器访问地址
     *              3：富文本图片回显let url = result.data.src;
     *       5：得到富文本的值：data.content=editor.txt.html();
     *       6：对富文本进行赋值：editor.txt.html(data.content);
     * 3.必须登录才能进入操作页面进行操作，否则弹出登录页面
     *      1.web端：页面加载的时候去判断,判断是否已经登录
     *      2.java端：过滤器
     */

    /**
     * 2023-6-7  redis基础
     * 1.秒杀事件
     *      用户首先回访问首页
     *      首页的数据来源于数据库
     *      如果同时有十万个访问，则数据库直接崩溃
     *      所以，想一个方法，不能让用户全部直接访问数据库
     *      所以，在数据库之前做一个拦截
     *      就说第一次访问的时候可以访问数据库，
     *      然后将数据库查询的内容保存在某一个地方（redis）
     *      其他人访问的时候直接访问刚刚（redis里面的）查询出来的数据即可
     *      ------------------------------------
     *      那么redis的拦截这一块代码应该写在那个地方？
     *
     *
     *  2.如果redis里面是字符串，在对相同的key进行增加的时候，新数据会覆盖老数据
     *  如果是集合，则会自动添加到刚刚的集合的后面
     *  所以，如果要删除结合的key，则建议删除所有集合的key
     * 3.因为页面上的数据有可能会随时修改，则下一次访问时，应该是新数据
     *      最简单的方法，就说在管理员修改完成，删除key值
     *      如何保持缓存的数据一致性
     */
}
